home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-04 / modula2f.zip / TEXT.MOD < prev    next >
Text File  |  1992-05-01  |  7KB  |  283 lines

  1. IMPLEMENTATION MODULE Text;
  2.  
  3. FROM SYSTEM IMPORT ASSEMBLER;
  4. FROM Strings IMPORT Length;
  5.  
  6. VAR atr,width,height:CARDINAL;
  7.  
  8. PROCEDURE Cls();
  9.     BEGIN
  10.         ASM
  11.             XOR CX,CX
  12.             MOV DL,width
  13.             MOV DH,height
  14.             MOV BH,atr
  15.             XOR AL,AL
  16.             MOV AH,6
  17.             INT 10H
  18.             XOR DX,DX
  19.             XOR BH,BH
  20.             MOV AH,2
  21.             INT 10H
  22.         END;
  23.      END Cls;
  24.  
  25. PROCEDURE Color(fgc,bgc:CARDINAL);
  26.     BEGIN
  27.         atr:=(bgc MOD 8)*16+(fgc MOD 16);
  28.     END Color;
  29.  
  30. PROCEDURE SetText();
  31.     BEGIN
  32.         ASM
  33.             MOV AX,3
  34.             INT 10H
  35.         END;
  36.         width := 79;
  37.         height := 24;
  38.     END SetText;
  39.  
  40. PROCEDURE SetEgaText();
  41.     BEGIN
  42.         ASM
  43.             MOV AX,85
  44.             INT 10H
  45.         END;
  46.         width := 131;
  47.         height := 24;
  48.     END SetEgaText;
  49.  
  50. PROCEDURE SetEga43();
  51.     BEGIN
  52.         ASM
  53.             MOV AX,84
  54.             INT 10H
  55.         END;
  56.         width := 131;
  57.         height := 42;
  58.     END SetEga43;
  59.  
  60. PROCEDURE SetCursor(v,h:CARDINAL);
  61.     BEGIN
  62.         IF v > height THEN
  63.             v := height;
  64.         END; (* if *)
  65.         IF h > width THEN
  66.             h := width;
  67.         END; (* if *)
  68.         ASM
  69.             MOV DL,h
  70.             MOV DH,v
  71.             XOR BH,BH
  72.             MOV AH,2
  73.             INT 10H
  74.         END;
  75.     END SetCursor;
  76.  
  77. PROCEDURE GetKey(VAR ch,scan:CHAR);
  78.     BEGIN
  79.         ASM
  80.             XOR AH,AH
  81.             INT 16H
  82.             LES DI,ch
  83.             MOV ES:[DI],AL
  84.             LES DI,scan
  85.             MOV ES:[DI],AH
  86.         END;
  87.     END GetKey;
  88.  
  89. PROCEDURE Read(VAR ch:CHAR);
  90.     VAR key,scan:CHAR;
  91.     BEGIN
  92.         GetKey(key,scan);
  93.         Write(key);
  94.         ch:=key;
  95.     END Read;
  96.  
  97. PROCEDURE ReadCard(VAR n:CARDINAL);
  98.     VAR str:ARRAY [0..5] OF CHAR;
  99.           i:CARDINAL;
  100.     BEGIN
  101.         ReadString(str);
  102.         n:=0;
  103.         IF Length(str) > 0 THEN
  104.             FOR i:=0 TO Length(str)-1 DO
  105.                 IF (str[i] >= '0') AND (str[i] <= '9') THEN
  106.                     n:=10*n+(ORD(str[i])-ORD('0'));
  107.                 END; (* if *)
  108.             END; (* for *)
  109.        END; (* if *)
  110.     END ReadCard;
  111.  
  112. PROCEDURE ReadInt(VAR i:INTEGER);
  113.     VAR str:ARRAY [0..6] OF CHAR;
  114.         c:CHAR;
  115.         x:CARDINAL;
  116.         p:INTEGER;
  117.         neg:BOOLEAN;
  118.     BEGIN
  119.         ReadString(str);
  120.         neg:=FALSE;
  121.         i:=0; p:=0;
  122.         IF Length(str) > 0 THEN
  123.             x:=0;
  124.             IF str[x] = "-" THEN
  125.                 neg:=TRUE; INC(x);
  126.             END; (* if *)
  127.             WHILE x < Length(str) DO
  128.                 IF (str[x] >= '0') AND (str[x] <= '9') THEN
  129.                     p:=10*p; c:=str[x];
  130.                     ASM
  131.                         XOR AX,AX
  132.                         MOV AL,c
  133.                         SUB AX,48
  134.                         ADD p,AX
  135.                     END;
  136.                     (* (ORD(str[x])-ORD('0')); *)
  137.                 END; (* if *)
  138.                 INC(x);
  139.             END; (* while *)
  140.         END; (* if *)
  141.         IF neg THEN
  142.             p:=-1*p;
  143.         END; (* if *)
  144.         i:=p;
  145.     END ReadInt;
  146.  
  147. PROCEDURE ReadString(VAR str:ARRAY OF CHAR);
  148.     VAR ch,sc:CHAR;
  149.         i:CARDINAL;
  150.     BEGIN
  151.         i:=0;
  152.         GetKey(ch,sc);
  153.         WHILE ch<>CHR(13) DO
  154.             IF (sc=CHR(14)) OR (sc=CHR(75)) THEN
  155.                 IF i>0 THEN
  156.                     DEC(i);
  157.                     ASM
  158.                         MOV AL,8
  159.                         MOV AH,14
  160.                         INT 10H
  161.                         MOV AL,32
  162.                         MOV AH,14
  163.                         INT 10H
  164.                         MOV AL,8
  165.                         MOV AH,14
  166.                         INT 10H
  167.                     END;
  168.                 END; (* if *)
  169.             ELSE
  170.                 Write(ch);
  171.                 str[i]:=ch;
  172.                 INC(i);
  173.             END; (* if *)
  174.             GetKey(ch,sc);
  175.         END; (* while *)
  176.         str[i]:=CHR(0);
  177.         WriteLn;
  178.     END ReadString;
  179.  
  180. PROCEDURE WriteString(str:ARRAY OF CHAR);
  181.     VAR i:CARDINAL;
  182.  
  183.     BEGIN
  184.         IF Length(str) > 0 THEN
  185.             FOR i:=0 TO Length(str)-1 DO
  186.                 Write(str[i]);
  187.             END; (* for *)
  188.         END; (* if *)
  189.     END WriteString;
  190.  
  191. PROCEDURE WriteCard(n,lngth:CARDINAL);
  192.     VAR buf:ARRAY [1..10] OF CHAR;
  193.         ln:CARDINAL;
  194.     BEGIN
  195.         IF lngth > 10 THEN
  196.             lngth:=10;
  197.         END; (* if *)
  198.         FOR ln:=1 TO 10 DO
  199.             buf[ln]:=CHR(0);
  200.         END; (* for *)
  201.         ln:=lngth;
  202.         buf[ln]:='0';
  203.         WHILE (n>0) AND (ln>0) DO
  204.             buf[ln]:=CHR((n MOD 10) + 48);
  205.             n:=n DIV 10;
  206.             DEC(ln);
  207.         END; (* while *)
  208.         FOR n:=1 TO lngth DO
  209.             Write(buf[n]);
  210.         END; (* for *)
  211.     END WriteCard;
  212.  
  213. PROCEDURE WriteInt(n:INTEGER; lngth:CARDINAL);
  214.     VAR buf:ARRAY [1..10] OF CHAR;
  215.         ln,c:CARDINAL;
  216.         neg:BOOLEAN;
  217.     BEGIN
  218.         IF lngth > 10 THEN
  219.             lngth:=10;
  220.         END; (* if *)
  221.         FOR ln:=1 TO 10 DO
  222.             buf[ln]:=CHR(0);
  223.         END; (* for *)
  224.         IF n<0 THEN
  225.             neg:=TRUE;
  226.             n:=-n;
  227.         ELSE
  228.             neg:=FALSE;
  229.         END; (* if *)
  230.             ASM
  231.                 MOV AX,n
  232.                 MOV c,AX
  233.             END;
  234.         ln:=lngth;
  235.         buf[ln]:='0';
  236.         WHILE (c>0) AND (ln>0) DO
  237.             buf[ln]:=CHR((c MOD 10)+48);
  238.             c:=c DIV 10;
  239.             DEC(ln);
  240.         END; (* while *)
  241.         IF (ln>0) AND neg THEN
  242.             buf[ln]:='-';
  243.             DEC(ln);
  244.         END; (* if *)
  245.         FOR ln:=1 TO lngth DO
  246.             Write(buf[ln]);
  247.         END; (* for *)
  248.     END WriteInt;
  249.  
  250. PROCEDURE Write(ch:CHAR);
  251.     BEGIN
  252.         ASM
  253.             MOV CX,1
  254.             MOV BL,atr
  255.             XOR BH,BH
  256.             MOV AL,ch
  257.             MOV AH,9
  258.             INT 10H
  259.             MOV AH,3
  260.             INT 10H
  261.             INC DL
  262.             MOV AH,2
  263.             INT 10H
  264.         END;
  265.     END Write;
  266.  
  267. PROCEDURE WriteLn();
  268.     BEGIN
  269.         ASM
  270.             MOV AL,10
  271.             MOV AH,14
  272.             INT 10H
  273.             MOV AL,13
  274.             MOV AH,14
  275.             INT 10H
  276.         END;
  277.     END WriteLn;
  278.  
  279. BEGIN               (* initialization *)
  280.     atr:=7;
  281.     width:=79;
  282.     height:=24;
  283. END Text.